package day05;

public class Demo02 {
	public static void main(String[] args) {

		// 数组一定创建, 长度不可变
		// 无法增减元素
		int[] arr = { 1, 2, 11, 3, 4, 5, 6, 7, 11, 8, 9 };
		// System.out.println(arr.length);

		// 如何向数组中添加(删除)元素
		//		System.out.println("执行操作之前, arr所指向的对象: "+arr);
		//		show(arr);
		//		arr = append(arr, 11);
		//		System.out.println("执行操作之后, arr所指向的对象: "+arr);
		// arr = insert(arr, 3, 11);
		//		arr = remove(arr, 3);
		//		show(arr);

		// 查找
		// 1. 查找指定元素在数组中第一次出现的位置
		int index = indexOf(arr, 3);
		System.out.println(index);

		// 2. 查找指定元素在数组中最后一次出现的位置
		index = lastIndexOf(arr, 3);
		System.out.println(index);
		
		// 判断元素在数组中是否重复
		boolean flag = indexOf(arr, 3) != lastIndexOf(arr, 3);
		System.out.println(flag);

	}

	/**
	 * 向指定数组末尾添加元素
	 * @param arr 要添加元素的数组
	 * @param val 要添加的元素
	 * @return 添加了新元素的新数组
	 */
	public static int[] append(int[] arr, int val) {
		int[] newArr = new int[arr.length + 1];
		System.out.println("方法内部, newArr所指向的对象: " + newArr);
		for (int i = 0; i < arr.length; i++) {
			newArr[i] = arr[i];
		}
		newArr[newArr.length - 1] = val;
		return newArr;
	}

	/**
	 * 向指定数组的指定位置添加元素
	 * 创建一个新数组, 长度为旧数组+1
	 * 将旧数组中索引小于index的元素
	 * 添加到新数组中对应的位置上
	 * 将旧数组中索引大于等于index的元素
	 * 添加到新数组的对应索引+1位置上
	 * 将目标元素添加到新数组的目标位置上
	 * @param arr 要添加元素的目标数组
	 * @param index 要添加元素的目标位置
	 * @param val 要添加的目标元素
	 * @return 添加了元素的新数组
	 */
	public static int[] insert(int[] arr, int index, int val) {
		int[] newArr = new int[arr.length + 1];

		for (int i = 0; i < arr.length; i++) {
			if (i < index) {
				newArr[i] = arr[i];
			} else {
				newArr[i + 1] = arr[i];
			}
		}

		newArr[index] = val;
		return newArr;

	}

	/**
	 * 移除数组指定位置的元素
	 * 创建一个新数组, 长度是旧数组-1
	 * 将旧数组中索引小于index的元素
	 * 添加到新数组对应位置上
	 * 当索引大于等于index时
	 * 旧数组i-1的位置元素放到新数组i位置上
	 * @param arr 要移除元素的目标数组
	 * @param index 要移除元素的索引
	 * @return 移除元素后的新数组
	 */
	public static int[] remove(int[] arr, int index) {
		int[] newArr = new int[arr.length - 1];
		for (int i = 0; i < newArr.length; i++) {
			if (i < index) {
				newArr[i] = arr[i];
				continue;
			}
			newArr[i] = arr[i + 1];

		}
		return newArr;
	}

	/**
	 * 查找指定元素在数组中第一次出现的位置
	 * @param arr 进行查找的目标数组
	 * @param val 要查找的元素
	 * @return 元素在数组中的索引; 如果目标元素不存, 则返回-1;
	 */
	public static int indexOf(int[] arr, int val) {
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] == val) {
				return i;
			}
		}
		return -1;
	}

	/**
	 * 查找指定元素在数组中最后一次出现的位置
	 * @param arr 要查找的目标数组
	 * @param val 要查找的目标元素
	 * @return 目标元素在数组中最后一次出现的位置; 如果目标元素不存在, 则返回-1;
	 */
	public static int lastIndexOf(int[] arr, int val) {
		for (int i = arr.length - 1; i >= 0; i--) {
			if (arr[i] == val) {
				return i;
			}
		}
		return -1;
	}

	// 遍历输出指定数组中的元素
	public static void show(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + (i < arr.length - 1 ? ", " : ""));
		}
		System.out.println();
	}
}
